Welcome Data Analyses Discussion Maps
Analyses
Urban Heat All Areas Portland Tacoma King County iNaturalist City Inventories

CITY INVENTORIES

library(tidyverse)
library(knitr)
library(kableExtra)
library(gghalves)
library(patchwork)
library(scales)
library(ggmap)
library(osmdata)

Purpose

Data Wrangling

Import Data

portland.parks <- read.csv('https://raw.githubusercontent.com/jmhulbert/redhot/main/data/Portland.Parks.Trees.AF.csv')
portland.streets <- read.csv('https://raw.githubusercontent.com/jmhulbert/redhot/main/data/Portland.Street.Trees.AF.csv')
seattle.combined <- read.csv('https://raw.githubusercontent.com/jmhulbert/redhot/main/data/Seattle.Trees.AF.csv')

Tidy Data

portland.parks <- portland.parks[c(3,4,6,7,8,14,35,36,40,42:45)]
portland.parks <- portland.parks %>% mutate(city.space="Park")

portland.streets <- portland.streets[c(3,4,5,9,10:19)]
portland.streets <- portland.streets %>% mutate(city.space="Street") %>% rename(DBH=DIAMETER) %>% rename(Functional=FUNCTIONAL)

portland.combined <- full_join(portland.streets,portland.parks,by = join_by(OBJECTID, Condition, DN_AF1, lat, lon, DBH,city.space,Functional)) %>% mutate(city="Portland") %>% mutate(DN_AFc=DN_AF1)

portland.combined$DN_AF1 <- ((portland.combined$DN_AF1 * 1.8) +32)
seattle.combined <- seattle.combined[c(1:8,11:14,17:19)] %>% mutate(city="Seattle") %>% rename(GlobalID=GLOBALID)

seattle.streets <- seattle.combined %>% filter(Source.Department=="Seattle Department of Transportation") %>% mutate(city.space="Street")
seattle.parks <- seattle.combined %>% filter(Source.Department=="Seattle Parks and Recreation") %>% mutate(city.space="Park")

seattle.combined.back <- rbind(seattle.streets,seattle.parks)

Categorize Trees

  • Portland Top-Dieback Probability Categories (10%)
    • Most Concern (>10%): > 88.5
    • Moderate Concern (2.5-10%): 84.32-88.5
    • Lowest Concern (<2.5%): <84.32
  • Portland Dieback Probability Cateogories (25%)
    • Most Concern (>25%): >91.66
    • Moderate Concern (5-25%): 86.48- 91.66
    • Lowest Concern (<5%): <86.48
portland.most <- portland.combined %>% filter(DN_AF1>88.5)%>% mutate(Category1="Most Concern") %>% droplevels()
portland.mod <- portland.combined %>% filter(DN_AF1>84.32 & DN_AF1<88.5) %>% mutate(Category1="Moderate Concern") %>% droplevels()
portland.low <- portland.combined %>% filter(DN_AF1<84.32) %>% mutate(Category1="Lowest Concern") %>% droplevels()

portland.combined.cat <- bind_rows(list(portland.low,portland.mod,portland.most))

portland.most <- portland.combined.cat %>% filter(DN_AF1>86.5)%>% mutate(Category1Plus2="Most Concern") %>% droplevels()
portland.mod <- portland.combined.cat %>% filter(DN_AF1>82.32 & DN_AF1<86.5) %>% mutate(Category1Plus2="Moderate Concern") %>% droplevels()
portland.low <- portland.combined.cat %>% filter(DN_AF1<82.32) %>% mutate(Category1Plus2="Lowest Concern") %>% droplevels()

portland.combined.cat <- bind_rows(list(portland.low,portland.mod,portland.most))

portland.most <- portland.combined.cat %>% filter(DN_AF1>91.66)%>% mutate(Category25="Most Concern") %>% droplevels()
portland.mod <- portland.combined.cat %>% filter(DN_AF1>86.48 & DN_AF1<91.66) %>% mutate(Category25="Moderate Concern") %>% droplevels()
portland.low <- portland.combined.cat %>% filter(DN_AF1<86.48) %>% mutate(Category25="Lowest Concern") %>% droplevels()


portland.combined.cat <- bind_rows(list(portland.low,portland.mod,portland.most))
  • King County Top-Dieback Probability Categories (10%)
    • Most Concern (>10%): >87.8
    • Moderate Concern (2.5-10%): 85.22-87.8
    • Lowest Concern (<2.5%): <85.22
  • King County Top-Dieback Probability Categories (25%)
    • Most Concern (>25%): 89.78
    • Moderate Concern (5-25%): 86.5 - 89.78
    • Lowest Concern (<5%): <86.5
seattle.most <- seattle.combined.back %>% filter(DN_AF1>87.8)%>% mutate(Category1="Most Concern") %>% droplevels()
seattle.mod <- seattle.combined.back %>% filter(DN_AF1>85.22 & DN_AF1<87.8) %>% mutate(Category1="Moderate Concern") %>% droplevels()
seattle.low <- seattle.combined.back %>% filter(DN_AF1<85.22) %>% mutate(Category1="Lowest Concern") %>% droplevels()

seattle.combined.cat <- bind_rows(list(seattle.low,seattle.mod,seattle.most))

seattle.most <- seattle.combined.cat %>% filter(DN_AF1>85.8)%>% mutate(Category1Plus2="Most Concern") %>% droplevels()
seattle.mod <- seattle.combined.cat%>% filter(DN_AF1>83.22 & DN_AF1<85.8) %>% mutate(Category1Plus2="Moderate Concern") %>% droplevels()
seattle.low <- seattle.combined.cat %>% filter(DN_AF1<83.22) %>% mutate(Category1Plus2="Lowest Concern") %>% droplevels()

seattle.combined.cat <- bind_rows(list(seattle.low,seattle.mod,seattle.most))

seattle.most <- seattle.combined.cat %>% filter(DN_AF1>89.78)%>% mutate(Category25="Most Concern") %>% droplevels()
seattle.mod <- seattle.combined.cat %>% filter(DN_AF1>86.5 & DN_AF1<89.78) %>% mutate(Category25="Moderate Concern") %>% droplevels()
seattle.low <- seattle.combined.cat%>% filter(DN_AF1<86.5) %>% mutate(Category25="Lowest Concern") %>% droplevels()

seattle.combined.cat <- bind_rows(list(seattle.low,seattle.mod,seattle.most))

87 trees in Seattle did not have UHI data. 1 tree in Portland did not have UHI data.

Join City Data

cities <- full_join(seattle.combined.cat,portland.combined.cat,by = join_by(OBJECTID, DBH, DN_AF1, lat, lon, city, city.space,GlobalID,Category1,Category1Plus2,Category25))

Summarize Data

summary <- cities %>% group_by(city,Category1) %>% summarize(n=n(),meanAF=mean(DN_AF1,na.rm=TRUE),n_AF_na=sum(is.na(DN_AF1)))
## `summarise()` has grouped output by 'city'. You can override using the
## `.groups` argument.
summary
## # A tibble: 6 × 5
## # Groups:   city [2]
##   city     Category1            n meanAF n_AF_na
##   <chr>    <chr>            <int>  <dbl>   <int>
## 1 Portland Lowest Concern     173   83.2       0
## 2 Portland Moderate Concern  1029   87.5       0
## 3 Portland Most Concern      1476   89.1       0
## 4 Seattle  Lowest Concern      49   84.2       0
## 5 Seattle  Moderate Concern  1639   87.0       0
## 6 Seattle  Most Concern       915   88.4       0
ggplot(summary,aes(n,Category1,fill=Category1))+geom_col(alpha=0.7) +facet_wrap(~city) +theme_bw() + scale_fill_manual(name="Category",values=c("#7fcdbb","#fe9929","#DDA0DD")) +labs(x="Number of Trees",y="Concern Category") +guides(fill="none")

summary <- cities %>% group_by(city,city.space,Category1) %>% summarize(n=n(),meanAF=mean(DN_AF1,na.rm=TRUE),n_AF_na=sum(is.na(DN_AF1)))
## `summarise()` has grouped output by 'city', 'city.space'. You can override
## using the `.groups` argument.
summary
## # A tibble: 12 × 6
## # Groups:   city, city.space [4]
##    city     city.space Category1            n meanAF n_AF_na
##    <chr>    <chr>      <chr>            <int>  <dbl>   <int>
##  1 Portland Park       Lowest Concern      89   83.3       0
##  2 Portland Park       Moderate Concern   266   87.6       0
##  3 Portland Park       Most Concern       609   89.1       0
##  4 Portland Street     Lowest Concern      84   83.2       0
##  5 Portland Street     Moderate Concern   763   87.5       0
##  6 Portland Street     Most Concern       867   89.0       0
##  7 Seattle  Park       Lowest Concern       5   83.8       0
##  8 Seattle  Park       Moderate Concern   434   87.1       0
##  9 Seattle  Park       Most Concern       371   88.5       0
## 10 Seattle  Street     Lowest Concern      44   84.3       0
## 11 Seattle  Street     Moderate Concern  1205   87.0       0
## 12 Seattle  Street     Most Concern       544   88.4       0
ggplot(summary,aes(n,city.space,fill=Category1))+geom_col(position=position_dodge(),alpha=0.7) +facet_wrap(~city) +theme_bw() + scale_fill_manual(name="Category",values=c("#7fcdbb","#fe9929","#DDA0DD")) +labs(x="Number of Trees",y="Tree Inventory")

summary <- cities %>% group_by(city,Category1) %>% summarize(n=n(),meanAF=mean(DN_AF1,na.rm=TRUE),n_AF_na=sum(is.na(DN_AF1)))
## `summarise()` has grouped output by 'city'. You can override using the
## `.groups` argument.
summary
## # A tibble: 6 × 5
## # Groups:   city [2]
##   city     Category1            n meanAF n_AF_na
##   <chr>    <chr>            <int>  <dbl>   <int>
## 1 Portland Lowest Concern     173   83.2       0
## 2 Portland Moderate Concern  1029   87.5       0
## 3 Portland Most Concern      1476   89.1       0
## 4 Seattle  Lowest Concern      49   84.2       0
## 5 Seattle  Moderate Concern  1639   87.0       0
## 6 Seattle  Most Concern       915   88.4       0

Portland

p <- ggplot(portland.combined.cat, aes(x=DN_AF1))+geom_histogram() +theme_bw() +labs(y="Number of Trees",x="Afternoon Temperature (F)")
p2 <- p + annotate(geom="rect",ymin = -Inf, ymax = Inf, 
              xmin = -Inf, xmax = 84.32, fill = alpha('#DDA0DD',0.5)) +
    annotate(geom="rect",ymin = -Inf, ymax = Inf, 
              xmin = 84.32, xmax = 88.5, fill = alpha('#7fcdbb',0.5)) + 
    annotate(geom="rect",ymin = -Inf, ymax = Inf, 
          xmin = 88.5, xmax = Inf, fill = alpha('#fe9929',0.5))
p3 <- p2 + annotate("text", x=82.3, y=30, label= "Lowest\nConcern") + annotate("text", x=86.8, y=30, label= "Moderate\nConcern") + annotate("text", x=90.1, y=30, label= "Most\nConcern")
p3
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

summary1 <- portland.combined.cat %>% group_by(city.space,Category1) %>% summarize(n=n(),meanAF=mean(DN_AF1,na.rm=TRUE),n_AF_na=sum(is.na(DN_AF1)))
## `summarise()` has grouped output by 'city.space'. You can override using the
## `.groups` argument.
summary1
## # A tibble: 6 × 5
## # Groups:   city.space [2]
##   city.space Category1            n meanAF n_AF_na
##   <chr>      <chr>            <int>  <dbl>   <int>
## 1 Park       Lowest Concern      89   83.3       0
## 2 Park       Moderate Concern   266   87.6       0
## 3 Park       Most Concern       609   89.1       0
## 4 Street     Lowest Concern      84   83.2       0
## 5 Street     Moderate Concern   763   87.5       0
## 6 Street     Most Concern       867   89.0       0
summary1Plus2 <- portland.combined.cat %>% group_by(city.space,Category1Plus2) %>% summarize(n=n(),meanAF=mean(DN_AF1,na.rm=TRUE),n_AF_na=sum(is.na(DN_AF1)))
## `summarise()` has grouped output by 'city.space'. You can override using the
## `.groups` argument.
summary1
## # A tibble: 6 × 5
## # Groups:   city.space [2]
##   city.space Category1            n meanAF n_AF_na
##   <chr>      <chr>            <int>  <dbl>   <int>
## 1 Park       Lowest Concern      89   83.3       0
## 2 Park       Moderate Concern   266   87.6       0
## 3 Park       Most Concern       609   89.1       0
## 4 Street     Lowest Concern      84   83.2       0
## 5 Street     Moderate Concern   763   87.5       0
## 6 Street     Most Concern       867   89.0       0
summary25 <- portland.combined.cat %>% group_by(city.space,Category25) %>% summarize(n=n(),meanAF=mean(DN_AF1,na.rm=TRUE),n_AF_na=sum(is.na(DN_AF1)))
## `summarise()` has grouped output by 'city.space'. You can override using the
## `.groups` argument.
summary25
## # A tibble: 4 × 5
## # Groups:   city.space [2]
##   city.space Category25           n meanAF n_AF_na
##   <chr>      <chr>            <int>  <dbl>   <int>
## 1 Park       Lowest Concern     134   84.1       0
## 2 Park       Moderate Concern   830   88.8       0
## 3 Street     Lowest Concern     232   84.7       0
## 4 Street     Moderate Concern  1482   88.6       0
ggplot(summary1,aes(n,city.space,fill=Category1))+geom_col(position=position_dodge(),alpha=0.7) +theme_bw() + scale_fill_manual(name="Category 1",values=c("#7fcdbb","#fe9929","#DDA0DD")) +labs(x="Number of Trees",y="Tree Inventory")

ggplot(summary1Plus2,aes(n,city.space,fill=Category1Plus2))+geom_col(position=position_dodge(),alpha=0.7) +theme_bw() + scale_fill_manual(name="Category 1 plus 2",values=c("#7fcdbb","#fe9929","#DDA0DD")) +labs(x="Number of Trees",y="Tree Inventory")

ggplot(summary25,aes(n,city.space,fill=Category25))+geom_col(position=position_dodge(),alpha=0.7) +theme_bw() + scale_fill_manual(name="Category 25",values=c("#7fcdbb","#fe9929","#DDA0DD")) +labs(x="Number of Trees",y="Tree Inventory")

Portland Map

portbb <- c(left = min(portland.combined.cat$lon), 
                              bottom = min(portland.combined.cat$lat), 
                              right = max(portland.combined.cat$lon), 
                              top = max(portland.combined.cat$lat))
portmap <- get_map(portbb, zoom = 11, scale = 2, maptype="terrain",source="google")
## ! Bounding box given to Google - spatial extent only approximate.
## ℹ <https://maps.googleapis.com/maps/api/staticmap?center=45.543068,-122.632381&zoom=11&size=640x640&scale=2&maptype=terrain&language=en-EN&key=xxx>
portland.map <- ggmap(portmap) + geom_point(data = portland.combined.cat, aes(x = lon, y = lat,fill=DN_AF1), color = "black",pch=21, size = 3) + theme_minimal() +scale_fill_viridis_c(option = "inferno")+labs(title="Portland",x="Longitude",y="Latitude",fill="Afternoon\nTemp (F)") +theme(plot.title = element_text(size = 14, hjust = .5,face = "bold.italic"))
portland.map

portland.map.cat1 <- ggmap(portmap) + geom_point(data = portland.combined.cat, aes(x = lon, y = lat,fill=Category1), color = "black",pch=21, size = 3) + theme_minimal() +scale_fill_manual(name="Category",values=c("#DDA0DD","#7fcdbb","#fe9929"))+labs(title="Portland",x="Longitude",y="Latitude",fill="Conservation\nCategory") +theme(plot.title = element_text(size = 14, hjust = .5,face = "bold.italic"))
portland.map.cat1Plus2 <- ggmap(portmap) + geom_point(data = portland.combined.cat, aes(x = lon, y = lat,fill=Category1Plus2), color = "black",pch=21, size = 3) + theme_minimal() +scale_fill_manual(name="Category",values=c("#DDA0DD","#7fcdbb","#fe9929"))+labs(title="Portland",x="Longitude",y="Latitude",fill="Conservation\nCategory") +theme(plot.title = element_text(size = 14, hjust = .5,face = "bold.italic"))
portland.map.cat25 <- ggmap(portmap) + geom_point(data = portland.combined.cat, aes(x = lon, y = lat,fill=Category25), color = "black",pch=21, size = 3) + theme_minimal() +scale_fill_manual(name="Category",values=c("#DDA0DD","#7fcdbb","#fe9929"))+labs(title="Portland",x="Longitude",y="Latitude",fill="Conservation\nCategory") +theme(plot.title = element_text(size = 14, hjust = .5,face = "bold.italic"))
portland.map.cat1

portland.map.cat1 <- portland.map.cat1  +labs(title="0.1 Probability") + theme(legend.position = "none")
portland.map.cat1Plus2 <- portland.map.cat1Plus2  +labs(title="0.1 Probability at 2 degrees higher") + theme(axis.title.y = element_blank())
portland.map.cat1Plus2.1 <- portland.map.cat1Plus2  +labs(title="0.1 Probability at 2 degrees higher") + theme(legend.position = "none",axis.title.y = element_blank())
portland.map.cat25 <-  portland.map.cat25  +labs(title="0.25 Probability") + theme(axis.title.y = element_blank())
portland.map.cat1 + portland.map.cat1Plus2

portland.map.cat1 + portland.map.cat1Plus2.1 + portland.map.cat25

Seattle

p <- ggplot(seattle.combined.cat, aes(x=DN_AF1))+geom_histogram() +theme_bw() +labs(y="Number of Trees",x="Afternoon Temperature (F)")
p2 <- p + annotate(geom="rect",ymin = -Inf, ymax = Inf, 
              xmin = -Inf, xmax = 84.32, fill = alpha('#DDA0DD',0.5)) +
    annotate(geom="rect",ymin = -Inf, ymax = Inf, 
              xmin = 84.32, xmax = 88.5, fill = alpha('#7fcdbb',0.5)) + 
    annotate(geom="rect",ymin = -Inf, ymax = Inf, 
          xmin = 88.5, xmax = Inf, fill = alpha('#fe9929',0.5))
p3 <- p2 + annotate("text", x=82.3, y=30, label= "Lowest\nConcern") + annotate("text", x=86.8, y=30, label= "Moderate\nConcern") + annotate("text", x=90.1, y=30, label= "Most\nConcern")
p3
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

summary1 <- seattle.combined.cat %>% group_by(city.space,Category1) %>% summarize(n=n(),meanAF=mean(DN_AF1,na.rm=TRUE),n_AF_na=sum(is.na(DN_AF1)))
## `summarise()` has grouped output by 'city.space'. You can override using the
## `.groups` argument.
summary1
## # A tibble: 6 × 5
## # Groups:   city.space [2]
##   city.space Category1            n meanAF n_AF_na
##   <chr>      <chr>            <int>  <dbl>   <int>
## 1 Park       Lowest Concern       5   83.8       0
## 2 Park       Moderate Concern   434   87.1       0
## 3 Park       Most Concern       371   88.5       0
## 4 Street     Lowest Concern      44   84.3       0
## 5 Street     Moderate Concern  1205   87.0       0
## 6 Street     Most Concern       544   88.4       0
summary1Plus2 <- seattle.combined.cat %>% group_by(city.space,Category1Plus2) %>% summarize(n=n(),meanAF=mean(DN_AF1,na.rm=TRUE),n_AF_na=sum(is.na(DN_AF1)))
## `summarise()` has grouped output by 'city.space'. You can override using the
## `.groups` argument.
summary1
## # A tibble: 6 × 5
## # Groups:   city.space [2]
##   city.space Category1            n meanAF n_AF_na
##   <chr>      <chr>            <int>  <dbl>   <int>
## 1 Park       Lowest Concern       5   83.8       0
## 2 Park       Moderate Concern   434   87.1       0
## 3 Park       Most Concern       371   88.5       0
## 4 Street     Lowest Concern      44   84.3       0
## 5 Street     Moderate Concern  1205   87.0       0
## 6 Street     Most Concern       544   88.4       0
summary25 <- seattle.combined.cat %>% group_by(city.space,Category25) %>% summarize(n=n(),meanAF=mean(DN_AF1,na.rm=TRUE),n_AF_na=sum(is.na(DN_AF1)))
## `summarise()` has grouped output by 'city.space'. You can override using the
## `.groups` argument.
summary25
## # A tibble: 6 × 5
## # Groups:   city.space [2]
##   city.space Category25           n meanAF n_AF_na
##   <chr>      <chr>            <int>  <dbl>   <int>
## 1 Park       Lowest Concern      90   86.0       0
## 2 Park       Moderate Concern   706   87.9       0
## 3 Park       Most Concern        14   90.2       0
## 4 Street     Lowest Concern     302   85.8       0
## 5 Street     Moderate Concern  1474   87.6       0
## 6 Street     Most Concern        17   90.4       0
ggplot(summary1,aes(n,city.space,fill=Category1))+geom_col(position=position_dodge(),alpha=0.7) +theme_bw() + scale_fill_manual(name="Category",values=c("#DDA0DD","#7fcdbb","#fe9929")) +labs(x="Number of Trees",y="Tree Inventory")

ggplot(summary1Plus2,aes(n,city.space,fill=Category1Plus2))+geom_col(position=position_dodge(),alpha=0.7) +theme_bw() + scale_fill_manual(name="Category",values=c("#DDA0DD","#7fcdbb","#fe9929")) +labs(x="Number of Trees",y="Tree Inventory")

ggplot(summary25,aes(n,city.space,fill=Category25))+geom_col(position=position_dodge(),alpha=0.7) +theme_bw() + scale_fill_manual(name="Category",values=c("#DDA0DD","#7fcdbb","#fe9929")) +labs(x="Number of Trees",y="Tree Inventory")

Seattle Map

seabb <- c(left = min(seattle.combined.cat$lon), 
                              bottom = min(seattle.combined.cat$lat), 
                              right = max(seattle.combined.cat$lon), 
                              top = max(seattle.combined.cat$lat))
seamap <- get_map(seabb, zoom = 11, scale = 2, maptype="terrain",source="google")
## ! Bounding box given to Google - spatial extent only approximate.
## ℹ <https://maps.googleapis.com/maps/api/staticmap?center=47.616324,-122.334218&zoom=11&size=640x640&scale=2&maptype=terrain&language=en-EN&key=xxx>
seattle.map <- ggmap(seamap) + geom_point(data = seattle.combined.cat, aes(x = lon, y = lat,fill=DN_AF1), color = "black",pch=21, size = 3) + theme_minimal() +scale_fill_viridis_c(option = "inferno")+labs(title="Seattle",x="Longitude",y="Latitude",fill="Afternoon\nTemp (F)") +theme(plot.title = element_text(size = 14, hjust = .5,face = "bold.italic"))
seattle.map

seattle.map.cat1 <- ggmap(seamap) + geom_point(data = seattle.combined.cat, aes(x = lon, y = lat,fill=Category1), color = "black",pch=21, size = 3) + theme_minimal() +scale_fill_manual(name="Category",values=c("#DDA0DD","#7fcdbb","#fe9929"))+labs(title="Seattle",x="Longitude",y="Latitude",fill="Conservation\nCategory") +theme(plot.title = element_text(size = 14, hjust = .5,face = "bold.italic"))
seattle.map.cat1Plus2 <- ggmap(seamap) + geom_point(data = seattle.combined.cat, aes(x = lon, y = lat,fill=Category1Plus2), color = "black",pch=21, size = 3) + theme_minimal() +scale_fill_manual(name="Category",values=c("#DDA0DD","#7fcdbb","#fe9929"))+labs(title="Seattle",x="Longitude",y="Latitude",fill="Conservation\nCategory") +theme(plot.title = element_text(size = 14, hjust = .5,face = "bold.italic"))
seattle.map.cat25 <- ggmap(seamap) + geom_point(data = seattle.combined.cat, aes(x = lon, y = lat,fill=Category25), color = "black",pch=21, size = 3) + theme_minimal() +scale_fill_manual(name="Category",values=c("#DDA0DD","#7fcdbb","#fe9929"))+labs(title="Seattle",x="Longitude",y="Latitude",fill="Conservation\nCategory") +theme(plot.title = element_text(size = 14, hjust = .5,face = "bold.italic"))
seattle.map.cat1

seattle.map.cat1 <- seattle.map.cat1  +labs(title="0.1 Probability") + theme(legend.position = "none")
seattle.map.cat1Plus2 <- seattle.map.cat1Plus2  +labs(title="0.1 Probability at 2 degrees higher") + theme(axis.title.y = element_blank())
seattle.map.cat1Plus2.1 <- seattle.map.cat1Plus2  +labs(title="0.1 Probability at 2 degrees higher") + theme(legend.position = "none",axis.title.y = element_blank())
seattle.map.cat25 <-  seattle.map.cat25  +labs(title="0.25 Probability") + theme(axis.title.y = element_blank())
seattle.map.cat1 + seattle.map.cat1Plus2

seattle.map.cat1 + seattle.map.cat1Plus2.1 + seattle.map.cat25

portland.map.cat1 <- ggmap(portmap) + geom_point(data = portland.combined.cat, aes(x = lon, y = lat,fill=Category1), color = "black",pch=21, size = 3) + theme_minimal() +scale_fill_manual(name="Category",values=c("#DDA0DD","#7fcdbb","#fe9929"))+labs(title="Portland",x="Longitude",y="Latitude",fill="Conservation\nCategory") +theme(plot.title = element_text(size = 14, hjust = .5,face = "bold.italic"))
seattle.map <- seattle.map + theme(legend.position = "none",axis.title.x = element_blank())
seattle.map.cat  <- seattle.map.cat1 + theme(legend.position = "none",plot.title = element_blank())
portland.map <- portland.map +theme(axis.title.x = element_blank(),axis.title.y = element_blank())
portland.map.cat <- portland.map.cat1 +theme(plot.title = element_blank(),axis.title.y = element_blank())


#+ theme(legend.position = "none",,)
(seattle.map | portland.map) / (seattle.map.cat | portland.map.cat)